/*
 * Copyright (c) 2003-2010, Live Media Pty. Ltd.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted
 * provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice, this list of
 *     conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice, this list of
 *     conditions and the following disclaimer in the documentation and/or other materials
 *     provided with the distribution.
 *  3. Neither the name of Live Media nor the names of its contributors may be used to endorse
 *     or promote products derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package com.colony.networkvm;

import com.argot.ResourceDictionaryLoader;
import com.argot.TypeException;
import com.argot.TypeLibrary;
import com.argot.auto.TypeArrayMarshaller;
import com.argot.auto.TypeReaderAuto;
import com.argot.auto.TypeSimpleReader;
import com.argot.auto.TypeSimpleWriter;
import com.argot.meta.MetaMarshaller;
import com.argot.remote.MetaInterface;
import com.colony.networkvm.instruction.NvmInstruction;
import com.colony.networkvm.instruction.NvmLoadCRLObject;
import com.colony.networkvm.instruction.NvmLoadHeapObject;
import com.colony.networkvm.instruction.NvmReturn;
import com.colony.networkvm.instruction.NvmStoreHeapObject;
import com.colony.networkvm.instruction.NvmToHostInstruction;
import com.colony.networkvm.machine.NvmHeap;
import com.colony.networkvm.machine.NvmState;
import com.colony.networkvm.proxy.NvmMetaMethodCall;

public final class NvmLoader
extends ResourceDictionaryLoader
{
	public static final String DICTIONARY = "networkvm.dictionary";
	
	public NvmLoader()
	{
		super( DICTIONARY );
	}
	
	public String getName()
	{
		return DICTIONARY;
	}
	
	public void bind( TypeLibrary library )
	throws TypeException
	{
		library.bind( library.getTypeId( "nvm.state", "1.3"), 
						new TypeReaderAuto( NvmState.class ), 
						new NvmState.NvmStateLibraryWriter(), 
						NvmState.class );
		
		library.bind( library.getTypeId("nvm.instructions", "1.3"), 
						new TypeArrayMarshaller(), 
						new TypeArrayMarshaller(), 
						NvmInstruction[].class );
		
		library.bind( library.getTypeId("nvm.instruction.base","1.3"), 
						new MetaMarshaller(), 
						new MetaMarshaller(), 
						null);
		
		library.bind( library.getTypeId("nvm.instruction.to_host", "1.3"),  
						new TypeSimpleReader(new NvmToHostInstruction.NvmToHostInstructionTypeReader()),
						new TypeSimpleWriter(new NvmToHostInstruction.NvmToHostInstructionTypeWriter()), 
						NvmToHostInstruction.class );
		
		library.bind( library.getTypeId("nvm.instruction.load_crl_object", "1.3"), 
						new TypeSimpleReader(new NvmLoadCRLObject.NvmLoadCRLObjectTypeReader()), 
						new TypeSimpleWriter(new NvmLoadCRLObject.NvmLoadCRLObjectTypeWriter()), 
						NvmLoadCRLObject.class );
		
		library.bind( library.getTypeId("nvm.instruction.load_heap_object", "1.3"),
						new TypeReaderAuto(NvmLoadHeapObject.class), 
						new NvmLoadHeapObject.NvmLoadHeapObjectTypeLibraryWriter(), 
						NvmLoadHeapObject.class );
		
		library.bind( library.getTypeId("nvm.instruction.named_method_call", "1.3"),
						new TypeSimpleReader(new NvmMetaMethodCall.NvmMetaMethodCallTypeReader()), 
						new TypeSimpleWriter(new NvmMetaMethodCall.NvmMetaMethodCallTypeWriter()), 
						NvmMetaMethodCall.class );
		
		library.bind( library.getTypeId("nvm.instruction.return", "1.3"),
						new TypeSimpleReader(new NvmReturn.NvmReturnTypeReader()), 
						new TypeSimpleWriter(new NvmReturn.NvmReturnTypeWriter()), 
						NvmReturn.class );
		
		library.bind( library.getTypeId("nvm.instruction.store_heap_object", "1.3"),
						new TypeReaderAuto(NvmStoreHeapObject.class), 
						new NvmStoreHeapObject.NvmStoreHeapObjectTypeLibraryWriter(), 
						NvmStoreHeapObject.class );
		
		library.bind( library.getTypeId("nvm.heap", "1.3"),
						new NvmHeap.NvmHeapTypeLibraryReader(), 
						new NvmHeap.NvmHeapTypeLibraryWriter(), 
						NvmHeap.class );
		
		library.bind( library.getTypeId("nvm.host", "1.3"),
						new TypeSimpleReader(new MetaInterface.MetaInterfaceReader()), 
						new TypeSimpleWriter(new MetaInterface.MetaInterfaceWriter()),
						INvmHost.class );
		
		library.addClassAlias( library.getTypeId("nvm.host","1.3"), NvmHostServer.class);
		
	}

}
